#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <cerrno>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<string>

const uint16_t port = 8080;
int main()
{
    // 1.创建socket，即打开一个文件
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0)
    {
        std::cout << "socket create erro" << errno << std::endl;
        return 1;
    }

    // 2.绑定IP和端口号
    struct sockaddr_in local;
    // 当前socket通信方式为网络套接。
    local.sin_family = AF_INET;
    local.sin_port = htons(port);

    // 绑定IP,需要将点分十进制IP转为32位整数IP地址，与此同时还要考虑大小端存储，
    // 所以使用inet_addr()接口即可
    // 但一般在服务器端，我们一般不显式绑定IP，因为在服务器端，可以认为一个服务器
    // 可以有多个IP，所以服务器可以接收所有向该主机IP传递的数据，而不是只接收
    // 给定的一个IP收到的数据

    local.sin_addr.s_addr = INADDR_ANY; // 默认接收向该主机所有IP传递的数据
    if (bind(sock, (const sockaddr *)&local, sizeof(local)) < 0)
    {
        std::cout << "bind err" << errno << std::endl;
        return 2;
    }

    //提供服务
    #define NUM 1024
    char buffer[NUM];
    while(1)
    {
        //1.接收从客户端发送的数据
        struct sockaddr_in peer;
        socklen_t len=sizeof(peer);
        recvfrom(sock,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,&len);
        std::cout <<"#client发送的数据: "<<buffer << std::endl;
        //2.获取到数据之后，向客户端发送返回的数据
        std::string message="hello";
        sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&peer,len);
    }

    return 0;
}